#include <stdio.h>
int dfs(int x, int y, int n, int m, int map[110][110], int dp[110][110], int *ans);
int main()
{
    int n, m, map[110][110], dp[110][110] = {0}, ans_max = 0, *ans = &ans_max;
    scanf("%d %d", &n, &m);
    // 输入map
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            scanf("%d", &map[i][j]);
    // dp
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            dp[i][j] = dfs(i, j, n, m, map, dp, ans);
    }
    // 输出dp
    // for (int i = 0; i < n; i++)
    // {
    //     for (int j = 0; j < m; j++)
    //         printf("%d ", dp[i][j]);
    //     printf("\n");
    // }
    printf("%d", *ans);
}
int dfs(int x, int y, int n, int m, int map[110][110], int dp[110][110], int *ans)
{
    if (dp[x][y])
    {

        return dp[x][y];
    }

    int max = 0;
    int tmp;
    if (x - 1 >= 0 && x < n && y >= 0 && y < m && map[x][y] > map[x - 1][y])
    {
        tmp = dfs(x - 1, y, n, m, map, dp, ans);
        if (tmp > max)
        {
            max = tmp;
        }
    }
    if (x >= 0 && x + 1 < n && y >= 0 && y < m && map[x][y] > map[x + 1][y])
    {
        tmp = dfs(x + 1, y, n, m, map, dp, ans);
        if (tmp > max)
        {
            max = tmp;
        }
    }
    if (x >= 0 && x < n && y - 1 >= 0 && y < m && map[x][y] > map[x][y - 1])
    {
        tmp = dfs(x, y - 1, n, m, map, dp, ans);
        if (tmp > max)
        {
            max = tmp;
        }
    }
    if (x >= 0 && x < n && y >= 0 && y + 1 < m && map[x][y] > map[x][y + 1])
    {
        tmp = dfs(x, y + 1, n, m, map, dp, ans);
        if (tmp > max)
        {
            max = tmp;
        }
    }
    if (max + 1 > *ans)
        *ans = max + 1;

    return max + 1;
}